package com.quectel.constant.global;

import lombok.Data;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 有child的树
 *
 * @author: cl
 * @email: louis.cao@quectel.com
 * @date: 2022-03-24 10:16:00
 */
@Data
public class TreeData implements Serializable {
    /**
     * 树的id
     */
    private String id;

    /**
     * 名称
     */
    private String name;

    /**
     * 父级id
     */
    private String parentId;

    /**
     * 父级名称
     */
    private String parentName;

    /**
     * 层级 从0开始
     */
    private Byte level;

    /**
     * 排序值升序排列
     */
    private Integer sort;

    /**
     * 展开 1展开0合并
     */
    private Byte open;

    /**
     * 扩展字段
     */
    private String extData;

    /**
     * 子节点
     */
    private List<TreeData> children;

    /**
     * 简单结构的数据转为有子节点
     *
     * @param simpleData   没有孩子节点的原始数据
     * @param rootParentId 树root节点的父级id
     * @return
     */
    public static List<TreeData> simpleToChildren(List<TreeData> simpleData, String rootParentId) {
        List<TreeData> result = new ArrayList<>();

        // 检查是否存在根节点，如果不存在则选择 parentId 最小的节点作为根节点
        boolean hasRoot = false;
        for (TreeData data : simpleData) {
            if (Objects.equals(data.getId(), rootParentId)) {
                hasRoot = true;
                break;
            }
        }

        if (!hasRoot) {
            String minParentId = null;
            for (TreeData data : simpleData) {
                if (minParentId == null || data.getParentId().compareTo(minParentId) < 0) {
                    minParentId = data.getParentId();
                }
            }
            rootParentId = minParentId;
        }

        // 构建树形结构
        for (TreeData c1 : simpleData) {
            if (Objects.equals(rootParentId, c1.getParentId())) {
                result.add(c1);
            }
            for (TreeData c2 : simpleData) {
                if (Objects.equals(c2.getParentId(), c1.getId())) {
                    if (c1.getChildren() == null) {
                        c1.setChildren(new ArrayList<>());
                    }
                    c2.setParentName(c1.getName());
                    c1.getChildren().add(c2);
                }
            }
        }
        return result;
    }

}
